package edu.zueb.sport.dao;

import edu.zueb.sport.entity.Borrow;
import edu.zueb.sport.rest.api.BorrowVO;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * BorrowMapper接口，用于定义与出借记录相关的数据库操作方法
 */
@Mapper
public interface BorrowMapper {
    /**
     * 插入一条出借记录
     * @param borrow 出借记录实体
     * @return 插入操作影响的行数
     */
    int insertBorrow(Borrow borrow);

    /**
     * 根据出借ID获取出借记录
     * @param borrowId 出借ID
     * @return 出借记录实体
     */
    Borrow getBorrowById(Integer borrowId);

    /**
     * 更新出借记录
     * @param borrow 出借记录实体
     * @return 更新操作影响的行数
     */
    int updateBorrow(Borrow borrow);

    /**
     * 根据出借ID删除出借记录
     * @param borrowId 出借ID
     * @return 删除操作影响的行数
     */
    int deleteBorrow(Integer borrowId);

    /**
     * 根据用户ID获取其出借记录列表
     * @param userId 用户ID
     * @return 出借记录列表
     */
    List<Borrow> listByUserId(Integer userId);

    /**
     * 根据出借状态获取出借记录列表
     * @param borrowStatus 出借状态（0=待审批，1=已批准，2=已拒绝，3=已归还）
     * @return 出借记录列表
     */
    List<Borrow> listByStatus(Integer borrowStatus);

    /**
     * 根据设备类型ID、用户ID、用户名、用户真实姓名统计出借记录数量
     *
     * @param equipmentTypeId 设备类型ID
     * @param userId          用户ID
     * @param username        用户名
     * @param userRealName    用户真实姓名
     * @return 出借记录数量
     */
    int countByPage(
            @Param("equipmentTypeId") Integer equipmentTypeId,
            @Param("userId") Integer userId,
            @Param("username") String username,
            @Param("userRealName") String userRealName);

    /**
     * 根据设备类型ID、用户ID、用户名、用户真实姓名分页查询出借记录列表
     *
     * @param equipmentTypeId 设备类型ID
     * @param userId          用户ID
     * @param username        用户名
     * @param userRealName    用户真实姓名
     * @param pageNo          页码
     * @param pageSize        每页大小
     * @return 出借记录列表
     */
    List<BorrowVO> listByPage(
            @Param("equipmentTypeId") Integer equipmentTypeId,
            @Param("userId") Integer userId,
            @Param("username") String username,
            @Param("userRealName") String userRealName,
            @Param("pageNo") Integer pageNo,
            @Param("pageSize") Integer pageSize);
}
